package level;

import flixel.FlxObject;
import flixel.FlxSprite;
import flixel.group.FlxTypedGroup;
import flixel.FlxG;
import actions.BasicContainer;


class RobotSpawner extends FlxObject
{	
	public var id(default, null): Int;


	public function new(X: Float, Y: Float, Id: Int)
	{
		super(X, Y);
		id = Id; 
		_spawnTime = 0;
		_robotSpawners.add(this);
		trace("Creating spawner with id "+id);
		// crea el gauge
		_showCursor = false;
		_cursor = new FlxSprite(X, Y, "assets/img/robot_spawner_cursor.png");
		_cursor.angularVelocity = 30;
		_canSpawn = true;
	}


	public function bind()
	{
		trace("calling bind in spawner");
	}

	public override function update(): Void
	{

		super.update();
		if(_showCursor)
		{
			_cursor.update();
		}


		// si es la primera vez que ejecutamos update() y todavía no estamos asociados 
		// a una computadora, hacemos el bind y creamos nuestro robot
		if(_theComputer == null)
		{
			_theComputer = Computer.findById(id);
			_robot = new Robot(x + 16, y + 16, id);
			_robot.alive = false;
			_robot.visible = false;
			_robot.setContainer(_theComputer.actionContainer);
		}

		// si tenemos permitido (por el DeveloperPanel) crear robots 
		if(_canSpawn)
		{
			// si el robot no está vivo, hacemos que se incremente el tiempo para "crearlo"
			if(!_robot.alive)
			{
				_spawnTime += FlxG.elapsed;
				// no tiene sentido crear un robot si el contenedor no tiene acciones
				if(_spawnTime >= SPAWN_TIME && _theComputer.actionContainer.getCount() > 0)
				{	
					_robot.reset(x + 16, y + 16);
					_robot.visible = true;
				}
			}
			else
			{
				_spawnTime = 0;
			}
		}
	}

	public function hasAliveRobot(): Bool
	{
		trace(_robot.alive);
		return _robot != null && _robot.alive;
	}

	public override function draw(): Void
	{
		super.draw();
		if(_showCursor) _cursor.draw();
	}


	public static function clearAll(){
		_robotSpawners.clear();
	}

	public static function getRobotSpawners(): FlxTypedGroup<RobotSpawner>
	{
		return _robotSpawners;
	}

	public function showCursor(Show: Bool)
	{
		_showCursor = Show;
	}

	public static function findById(Id: Int)
	{
		for(spawner in _robotSpawners.members)
		{
			if(spawner.id == Id)
			{
				return spawner;
			}
		}
		throw("ERROR: No se encontro RobotSpawner con id: "+Id);
		return null;
	}

	public function canSpawn(CanSpawn: Bool)
	{
		if(!CanSpawn && _robot != null)
		{
			_robot.kill();
		}
		if(CanSpawn)
		{
			_spawnTime = 0;
		}
		_canSpawn = CanSpawn;
	}

	public function getRobot(): Robot
	{
		return _robot;
	}

	private static var _robotSpawners: FlxTypedGroup<RobotSpawner> = new FlxTypedGroup<RobotSpawner>();

	private var _showCursor: Bool = false;
	private var _cursor: FlxSprite;
	private var SPAWN_TIME: Float = 3;
	private var _spawnTime: Float;
	private var _canSpawn: Bool = false;
	private var _theComputer: Computer = null;
	private var _robot: Robot = null;
}